package org.jerrymouse.jsa4j.db.kv;

/**
 * 数据库对象。他代表了一个Key-value数据库。<br/>
 * 这个数据库只有存取两种操作<br/>
 * 这是一个比较底层的类，对于一般的应用，应该使用@see {@link Repository}
 * 
 * 
 * @author yankai
 */
public interface DB {

	/**
	 * 取操作
	 * 
	 * @param key
	 *            键
	 * @return 值，理论上是一个json对象。当然看你存入的是什么了
	 */
	String get(String key);

	/**
	 * 
	 * 存操作。
	 * <ul>
	 * <li>如果Key为null,value也为null,则不操作</li>
	 * <li>如果key为null,value不为null,<b>不操作而不是执行insert操作</b></li>
	 * <li>如果key不为null,且在数据库中存在对应的value, value也为null，执行delete操作</li>
	 * <li>如果key不为null,且在数据库中存在对应的value, value不为null，执行update操作</li>
	 * <li>如果key不为null,但在数据库中不存在对应的value,,value为null,则不操作</li>
	 * <li>如果key不为null,但在数据库中不存在对应的value,,value不为null,执行inerst操作</li>
	 * </ul>
	 * 
	 * 注意点：DB提供的是数据库的底层操作。不提供主键生成机制。
	 * 
	 * @param key
	 *            如果是insert操作，key中必须含有类型信息，否则结果不可预知
	 * @param value
	 *            一个JSON对象，也可以是别的
	 * @return 刚刚操作的那个对象的key
	 */
	String put(String key, String value);

}
